#Python内置的random模块用法
import random

#生成[0,1)随机浮点数random.random()
a1=random.random()
print(a1)

#生成[a,b]之间的随机浮点数random.uniform()
a2=random.uniform(2,3)
a3=random.uniform(-12,-3)
print(a2)
print(a3)

#在[a,b]之间随机生成一个整数并返回random.randint()
a4=random.randint(3,10)
print(a4)

#random.randrange(start, stop, step) 生成[start,stop)间隔step的随机整数
a5=random.randrange(2,10,2)#step>=1且为整数,start<stop,否则ValueError
a6=random.randrange(8,1,-2)#step<=-1，start>stop
a7=random.randrange(4)#只传一个参数，start默认为0，step默认为1
print(a5)
print(a6)
print(a7)

#random.choice(seq)：从序列seq中随机取一个元素,seq可以为字符串，列表，元组,不可以是字典
a8=random.choice('13456')
a9=random.choice(['a','g','12','='])
print(a8)
print(a9)

"""
random.choices()
random.choices(population, weights=None, *, cum_weights=None, k=1)
返回：返回一个元素个数为k的列表，元素是从population中随机获取（可重复）
参数：
population：必须是序列形式的（字符串不行），比如列表、元组、集合、序列类型(range这种）等
weights：相对权重设置，序列形式传入，序列的元素个数必须与population的元素个数保持一致
cum_weights：累加权重，序列形式传入，序列的元素个数必须与population的元素个数保持一致
k：随机获取次数，即循环多少次从population中随机获取元素，默认为1
"""
#未设置权重
#random.choices(population,k)从population中随机取出k个元素，返回列表
li1=['a','b','c','d']
a10=random.choices(li1,k=8)
print(a10)
#设置weights,权重代表被选中的概率
"""
weights=[2, 3, 1, 3]时，第一、二、三的概率分别为2/9、3/9、1/9，计算方式为：对应权重/总权重，总权重weights各个元素的和，即2+3+1+3=9
"""
a11=random.choices(li1,weights=[1,2,3,3],k=6)#weights=len(li1),必须
print(a11)
#累加权重
"""
可以以相对权重去理解累加权重，比如weights=[2, 3, 1, 3]想转成累加权重的话，思路如下：
第1个元素累加权重值cum_weights[0]计算：前面没有其他元素了，前一个元素的权重值可以理解为0，所以它的累加权重值是weights[0]+0，即cum_weights[0] = weights[0] = 2
第2个元素累加权重值cum_weights[1]计算：前一个元素的累加权重值cum_weights[0]，第二个元素自个的权重值是weights[1]，所以cum_weights[1]=cum_weights[0]+weights[1]=2+3=5
第3个元素累加权重值cum_weights[2]计算：前一个元素的累加权重值cum_weights[1]，第二个元素自个的权重值是weights[2]，所以cum_weights[2]=cum_weights[1]+weights[2]=5+1=6
第4个元素累加权重值cum_weights[3]计算：前一个元素的累加权重值cum_weights[2]，第二个元素自个的权重值是weights[3]，所以cum_weights[3]=cum_weights[2]+weights[3]=6+3=9
最后得出weights=[2, 3, 1, 3]转成累加权重的设置是：cum_weights=[2, 5, 6, 9]
"""
a12=random.choices(li1,cum_weights=[1,3,1,1],k=4)
print(a12)



"""
random.sample()
random.sample(population, k, counts=None)：将population中的元素按照counts进行复制处理后，
随机从处理后的序列中获取k个元素（每一个元素不重复取）并以列表的形式返回

population：必须是序列形式的（字符串不行），比如列表、集合、序列类型(range这种）等
counts：序列形式传入，序列的元素个数必须与population的元素个数保持一致
k：获取的元素个数，必传，且必须满足k<=population与counts处理后的元素个数，否则会报错
注意： sample()不重复取同一个索引的元素，并不表示返回的元素是不重复的，如果population和counts处理后的序列有重复的元素，则可能会返回一样的元素
"""
"""
counts处理方法
r3 = random.sample(data, 4, counts=[0, 1, 2, 1])
如果传入了counts参数，则是对data进行处理后，在处理后的序列中随机取值
counts的处理逻辑：counts是指定了data对应索引的值的个数,
即data[0]元素有count(0)=0个，data[1]元素有count(1)=1个，data[2]元素有count(2)=2个，data[3]元素有count(3)=1个
"""
a13=random.sample(li1,3,counts=[1,0,1,2])#此时为['a','c','d','d'],且k<len(li1)
print(a13)



#random.shuffle()随机排序
random.shuffle(li1)#将li1中元素打乱顺序
print(li1)